package org.example.study2;

// 如何检查线程的存活状态（isAlive()方法）及等待线程结束（join()方法）
public class Demo_205 {
    public static void main(String[] args) throws InterruptedException {
        // 创建一个新线程，使用Lambda表达式定义线程任务
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("hello  thread.. ");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程执行完成。");

        });

        // 启动线程前检查线程是否存活（预期：false）
        System.out.println("启动之前查看线程是否存活：" + thread.isAlive());
        // 启动线程，使线程进入就绪状态（JVM会调度执行）
        thread.start();
        // 启动后立即检查存活状态（此时线程可能正在运行或就绪）
        System.out.println("启动之后查看线程是否存活：" + thread.isAlive());
        // 主线程调用join()，等待新线程执行完毕后再继续
        thread.join();
        // 保证PCB已销毁
        Thread.sleep(1000);
        // 再次检查线程存活状态（false，因为线程已终止）
        System.out.println("线程结束之后查看线程是否存活：" + thread.isAlive());

    }
}

/*
输出：
        启动之前查看线程是否存活：false
        hello  thread..
        启动之后查看线程是否存活：true
        hello  thread..
        hello  thread..
        hello  thread..
        hello  thread..
        线程执行完成。
        线程结束之后查看线程是否存活：false*/

/*总结：
        线程生命周期：
        NEW（未启动）→ RUNNABLE（就绪/运行）→ TERMINATED（终止）。
        isAlive()在RUNNABLE和BLOCKED/WAITING状态均返回true。

        join()的作用：
        确保主线程等待子线程完成，避免并发问题（如子线程未结束就访问其数据）*/
